/*
 * @Descripttion: 函数公共方法集
 * @Author: sichuntian
 * @Date: 2021-11-23 23:22:23
 */
let NodeRSA = require("node-rsa");
const methodObject = {};

/**
 * @desc 字符串去空格
 * @param {str} str
 * @return {str} 去空格之后的字符串
 */
methodObject.trimAll = function (str) {
  if (!str) {
    return "";
  }
  return str.replace(/\s+/g, "");
};

/**
 * @desc 计算字符串长度(英文占1个字符，中文汉字占2个字符)
 * @param {str} str
 * @return {num} 字符串长度
 */
methodObject.getStrLen = function (str) {
  var strlength = str.length;
  for (var i = 0; i < str.length; i++) {
    if (str.charCodeAt(i) > 255) {
      // 判断输入的是否是汉字，如果是汉字的话，则字符串长度加2
      strlength += 1;
    }
  }
  return strlength;
};

/**
 * @desc 判断浏览器类型
 * @return {string}
 */
methodObject.uainfo = function () {
  var Sys = {};
  var ua = navigator.userAgent.toLowerCase();
  var s;
  (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] : (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] : (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] : (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] : (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
  if (Sys.ie) return 'IE';
  if (Sys.firefox) return 'Firefox:';
  if (Sys.chrome) return 'Chrome';
  if (Sys.opera) return 'Opera';
  if (Sys.safari) return 'Safari';
};

/**
 * @desc 判断是否是微信内置浏览器
 * @return {bool}
 */
methodObject.isWeixin = function () {
  // 对浏览器的UserAgent进行正则匹配，不含有微信独有标识的则为其他浏览器
  var useragent = navigator.userAgent.toLowerCase();
  if (useragent.match(/MicroMessenger/i) === "microMessenger") {
    return true;
  } else {
    return false;
  }
};

/**
 * @desc 是否为数组
 * @param {*} obj
 * @return {bool}
 */
methodObject.isArray = function (obj) {
  return Object.prototype.toString.call(obj) === "[object Array]";
};

/**
 * @desc 是否为空数组
 * @param {arr} arr
 * @return {bool} true 空 false 非空
 */
methodObject.isArrayEmpty = function (arr) {
  return this.isArray(arr) && arr.length <= 0;
};

/**
 * @desc 是否为对象
 * @param {*} obj
 * @return {bool}
 */
methodObject.isObject = function (obj) {
  return Object.prototype.toString.call(obj) === "[object Object]";
};

/**
 * @desc 是否为函数
 * @param {*} obj
 * @return {bool} 校验结果
 */
methodObject.isFunc = function (obj) {
  return (
    Object.prototype.toString.call(obj) === "[object Function]"
  );
};

/**
 * @desc 小于10的数之前补零
 * @param {num|str} n
 * @return {str} 补零之后字符串
 */
methodObject.addZero = function (n) {
  return n < 10 ? "0" + n : "" + n;
};

/**
 * @desc 时间戳转年月日
 * @param {str} ns 时间戳
 * @param {str} symbol （可选，默认为 "-" ）
 * @example formatDate(new Date())
 * @return 返回 2018-07-24
 */
methodObject.formatDate = function (nS, symbol) {
  symbol = symbol !== "" && symbol ? symbol : "-";
  var DD = new Date(Number(nS));
  var year = this.addZero(DD.getFullYear());
  var month = this.addZero(DD.getMonth() + 1);
  var day = this.addZero(DD.getDate());
  var time = year + symbol + month + symbol + day;
  return time;
};

/**
 * @desc 格式化时间字符串，将毫秒数转化成时间格式
 * @param {str} _longtime    毫秒数，字符串
 * @return {str}     时间格式：hh:mm:ss  19:09:56
 */
methodObject.formatTime = function (_longtime) {
  if (_longtime) {
    var longtime = Number(_longtime);
    var date = new Date(longtime);
    var _hour = date.getHours(); // 时
    var _minute = date.getMinutes(); // 分
    var _second = date.getSeconds(); // 秒
    if (_hour < 10) {
      _hour = "0" + _hour;
    }
    if (_minute < 10) {
      _minute = "0" + _minute;
    }
    if (_second < 10) {
      _second = "0" + _second;
    }
    return _hour + ":" + _minute + ":" + _second;
  }
};

/**
 * 时长格式转换
 * 00:00:00
 * @param{String} 秒
 */
methodObject.formatSeconds = function (value) {
  let secondTime = parseInt(value); // 秒
  let minuteTime = 0; // 分
  let hourTime = 0; // 小时
  if (secondTime > 60) {
    // 如果秒数大于60，将秒数转换成整数
    // 获取分钟，除以60取整数，得到整数分钟
    minuteTime = parseInt(secondTime / 60);
    // 获取秒数，秒数取佘，得到整数秒数
    secondTime = parseInt(secondTime % 60);
    // 如果分钟大于60，将分钟转换成小时
    if (minuteTime > 60) {
      // 获取小时，获取分钟除以60，得到整数小时
      hourTime = parseInt(minuteTime / 60);
      // 获取小时后取佘的分，获取分钟除以60取佘的分
      minuteTime = parseInt(minuteTime % 60);
    }
  }
  let result = "";
  if (secondTime > 0) {
    if (secondTime < 10) {
      result = "0" + parseInt(secondTime);
    } else {
      result = parseInt(secondTime);
    }
  } else {
    result = "00";
  }
  if (minuteTime > 0) {
    if (minuteTime < 10) {
      result = "0" + parseInt(minuteTime) + ":" + result;
    } else {
      result = parseInt(minuteTime) + ":" + result;
    }
  } else {
    result = "00:" + result;
  }
  if (hourTime > 0) {
    if (hourTime < 10) {
      result = "0" + parseInt(hourTime) + ":" + result;
    } else {
      result = parseInt(hourTime) + ":" + result;
    }
  } else {
    result = "00:" + result;
  }
  return result;
};

/**
 * 随机数
 * flag-是否任意长度 true 任意长度 false 固定长度
 * min-任意长度最小位[固定位数] max-任意长度最大位
 * setRandomString(true, 3, 16)
 * setRandomString(false, 16)
 */
methodObject.setRandomString = function (flag, min, max) {
  let randomStr = "_";
  let range = min;
  let arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

  // 随机产生
  if (flag) {
    range = Math.round(Math.random() * (max - min)) + min;
  }
  for (let i = 0; i < range; i++) {
    let pos = Math.round(Math.random() * (arr.length - 1));
    randomStr += arr[pos];
  }
  return randomStr;
}

/**
 * @desc 对象合并（目标对象与源对象有同名属性，或多个源对象有同名属性，则后面的属性会覆盖前面的属性）
 * @param {obj} target
 * @param {obj} ...source
 * @return {obj}
 */
methodObject.merging = function (target, ...source) {
  Object.assign(target, ...source);
  return target;
};

/**
 * @desc 浅拷贝
 * @param {obj} source
 * @return {obj} 返回新对象
 * 源对象的【属性】是【普通类型】改变之后新对象【不会】改变
 * 源对象的【属性】是【引用类型】改变后新对象也【会】改变
 */
methodObject.shallowClone = function (source) {
  return Object.assign({}, source);
};

/**
 * @desc 深拷贝(经递归处理，同样应用于多层嵌套)
 * @param {obj} source
 * @return {obj} 返回新对象
 * 返回的新对象和源对象没有关系，不会随源对象改变而改变
 */
methodObject.deepClone = function (source) {
  let result;
  // 如果当前需要深拷贝的是一个对象的话
  if (typeof source === 'object') {
    // 如果是一个数组的话
    if (Array.isArray(source)) {
      result = []; // 将result赋值为一个数组，并且执行遍历
      for (let i in source) {
        // 递归克隆数组中的每一项
        result.push(this.deepClone(source[i]));
      }
      // 判断如果当前的值是null的话；直接赋值为null
    } else if (source === null) {
      result = null;
      // 判断如果当前的值是一个RegExp对象的话，直接赋值
    } else if (source.constructor === RegExp) {
      result = source;
    } else {
      // 否则是普通对象，直接for in循环，递归赋值对象的所有值
      result = {};
      for (let i in source) {
        result[i] = this.deepClone(source[i]);
      }
    }
    // 如果不是对象的话，就是基本数据类型，那么直接赋值
  } else {
    result = source;
  }
  return result;
};

/**
 * @desc 根据特定属性的值删除数组中的某个元素
 * arr是需要处理处理的数组，attr是数组元素对象的属性，value是属性值
 */
methodObject.removeByValue = function (array, attr, value) {
  var index = 0
  for (var i in array) {
    if (array[i][attr] == value) {
      index = i
      break;
    }
  }
  array.splice(index, 1)
};

/**
 * @desc 格式化money
 */
methodObject.formatMoney = function (num) {
  return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};

/**
 * @desc 生成一定位数的随机ID
 */
methodObject.randomId = function (len) {
  return Math.random().toString(36).substr(3, len)
};

/**
 * @desc 生成一定位数的随机字符串
 */
methodObject.randomString = function (len) {
  len = len || 32;
  var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
  var maxPos = $chars.length;
  var pwd = '';
  for (var i = 0; i < len; i++) {
    pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
};

/**
 * @desc 生成一定位数的随机ID
 */
methodObject.randomId = function (len) {
  return Math.random().toString(36).substr(3, len)
};

/**
 * @desc 生成随机HEX颜色值
 */
methodObject.randomColor = function (len) {
  return "#" + Math.floor(Math.random() * 0xffffff).toString(16).padEnd(6, '0')
};

/**
 * @desc 网址参数查询
 */
methodObject.params = function () {
  return new URLSearchParams(location.search.replace(/\?/ig, ""));
};

/**
 * @desc NodeRSA私钥加密，公钥解密
 */
methodObject.rsaDecode = function (str, pubkey) {
  const default_pubkey = `-----BEGIN PUBLIC KEY-----
                      MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0/yHFCptnggtiiL8cDH2
                     abOOSS7oEMut0W3GOaWHECSY1wYZ8H8u7NgwIwWqnCVj5kvM0BtjutyQHNv4hxg+
                     wutkjneDsrN5RdHxLRvLfiRESrUNudQldSS6R77/e2FGJxjsBbiT8Uy9s9sOK4GU
                     aBVCDI0DoMx0CBuDfqkf9wWKz4QJYMFV/9w52h4u4eqNC+LgRLQEX1YEAv+vmlNZ
                     vHkwF6aPzgFupngLX1LqBmfNnIcnIw8tayC95QGz0OSBJYuUCrd2w/hPShPZ+h5I
                     WCbF2QWMSxkKEC2QJE7+Zjg+nlchwRSN8BKYh7NE4q9VS4kmfTEiHzPfd74lHqXm
                     /wIDAQAB
                      -----END PUBLIC KEY-----`;
  let data = str || 'uAzqvinSQ/X30MqqOw3tpw1ng9OjxSBNr1HWzzjrGzPKUSuydvzgV9P4ema0IhJ/T6YsO1BF9GtnTnW+uQ98up96Wg0bQA3d+wiFmPUmwYqFfeQBRE6Qb9DM9gp9cNcNmWK6PZXEUclvoMjPyBzcYKQzd/bGlBn7ZV0Le3YZd0NTEgjSFRWHWkGyCNPDNsmfHnAqIp7RwJOxTPf3IhhzjiRTXb1t01a8UHUbMBKMLzNi/d2a17m6TWLnQv2FIPEru0p+cFWlADxLBiRIvLesT0MAZ6kXf3gYaNdgrtP6hv/KxC/NWn//2xvpHa9S8Phc5V0CT6vkAD+0BfNtkTtHJg=='
  let publicKey = pubkey || default_pubkey
  let pubKeyObj = new NodeRSA(publicKey);  // 设置你的公钥
  const result = pubKeyObj.decryptPublic(data, "utf8")
  return result
};

/**
 * @desc NodeRSA私钥加密，公钥解密案例
 */
methodObject.rsaDemo = function (str, pubkey) {
  const _pubKey = `-----BEGIN PUBLIC KEY-----
                      MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXCAjACBKL9BIkiawOJpy6Q3nr
                      bI29b3tVxcRIEkr4DAkoGjnH5qg5lGsN9joxtx9bP819wfIu3/BkcmEu1uhcKbYP
                      Rbch/k+W3X/FERm9ZNLa0PK2RvJcHRdE6r3kfxoWzu8OiRm4Fda2V0CRAa4ZP9fB
                      2JD4exmJQvAcfKKeNQIDAQAB
                      -----END PUBLIC KEY-----`;
  const _priKey = `-----BEGIN RSA PRIVATE KEY-----
                      MIICXAIBAAKBgQCXCAjACBKL9BIkiawOJpy6Q3nrbI29b3tVxcRIEkr4DAkoGjnH
                      5qg5lGsN9joxtx9bP819wfIu3/BkcmEu1uhcKbYPRbch/k+W3X/FERm9ZNLa0PK2
                      RvJcHRdE6r3kfxoWzu8OiRm4Fda2V0CRAa4ZP9fB2JD4exmJQvAcfKKeNQIDAQAB
                      AoGAPavZLtjdAesLEYJqEGkx7FkrSrfL9QO1wCN+b9OQa1M21fpHh9om7UQupsfZ
                      oX1eP3uBJI3yn7NvzQRrrJ2yyXWyqOgQuphLg4HAns1qPZDHvgSQov7SMdnjh2lB
                      eSHiF74ENrzYKEfE0fkyEK8OwbwCigyn0BFPFhoU+Usvr+0CQQDeJSBcY+Cs3kss
                      0wjz0umxoXlC2l069YkQ9BM9+t+JS4g55+ZZ4NsVYQSuxJwgNsRfwKmb7H6sIwGo
                      +c65EdDTAkEArgxyGrgCWntGaqingi4bsddTwfnHUjYBJVwcHWKi+HlCVEjcFcll
                      rwz+rNYg2u2g8CijcRhVj6SjshPjZ+Sv1wJBANIgHh8mXnRGBKfOqs4vt9vM2G3T
                      LZLChDdkF/ttnRo6Nw5G+84SckkjrxE9akzSYSgNjqGtrxhWOJDEUrUeU/8CQFnk
                      I6qZDt4cfSnpIVqi5brcM24jy0YyjjT1da/XmcQrHI7bco/uDI50b7Rkg2OPB2gC
                      FSf8IXSm28TFcNXfztECQDqKiH85A09vxEq9iUUVd1mZzLF69GSE+cJiNxBbekMh
                      G7KsyvgmFxgd+Zpjeah3OX6mSWKQZcd2WyA6wX0eqsE=
                      -----END RSA PRIVATE KEY-----`;
  let priKey = new NodeRSA(_priKey);
  // 私钥加密
  let data = priKey.encryptPrivate("hello", 'base64');
  // 公钥解密
  let pubKey = new NodeRSA(_pubKey);  // 设置你的公钥
  const result = pubKey.decryptPublic(data, "utf8")
  console.log(result); // 解密数据
};
export default methodObject;